#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<fcntl.h> 
#include<sys/stat.h> 
#define FILENAME "log.txt"



//证明缓冲区的存在
int main()
{
    //使用系统调用
    const char* s1 = "hello write\n";
    write(1,s1,strlen(s1));
    //使用C语言接口
    const char* s2 = "hello fprintf\n";
    fprintf(stdout,"%s",s2);

    const char* s3 = "hello fwrite\n";
    fwrite(s3,strlen(s3),1,stdout);
    fork();
    return 0;
}

// int main()
// {
//     int fd = open("newfile",O_RDONLY,0666);

//     dup2(fd,0);//将文件的文件描述符与标准输出进行绑定
//     char buffer[1024];
//     while(1)
//     {
//         //默认情况，stdin会从键盘中读取，若键盘不输入，是会发生阻塞的
//         char* s = fgets(buffer,sizeof(buffer),stdin);//此时stdin会默认从文件中读取
//         if(s==NULL)break;
//         printf("file content:%s",buffer);
//     }
//     return 0;
// }

// //使用dup2
// int main()
// {
//     int fd = open("newfile",O_WRONLY|O_CREAT|O_APPEND,0666);
//     dup2(fd,1);//将newfile文件与标准输出进行绑定
//     //这样printf就会默认向上述文件进行输出
//     printf("hello newfile\n");
//     return 0;
// }

// //认识文件描述符
// int main()
// {
//     int fd1 = open("HF1.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);
//     int fd2 = open("HF2.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);
//     int fd3 = open("HF3.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);
//     int fd4 = open("HF4.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);
//     int fd5 = open("HF5.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);

//     printf("fd1:%d\n",fd1);
//     printf("fd2:%d\n",fd2);
//     printf("fd3:%d\n",fd3);
//     printf("fd4:%d\n",fd4);
//     printf("fd5:%d\n",fd5);
//     printf("stdin fd:%d\n",stdin->_fileno);
//     printf("stdout fd:%d\n",stdout->_fileno);
//     printf("stderr fd:%d\n",stderr->_fileno);
//     return 0;
// }

// int main()
// {
//     umask(0);
//     int fd = open("HF.txt",O_WRONLY | O_CREAT,0666);
//     const char* str = "hello write\n";
//     write(fd,str,strlen(str));
//     return 0;
// }

// //使用open
// int main()
// {
//     umask(0);
//     int fd = open("HF.txt",O_WRONLY | O_CREAT,0666);
//     if(fd == -1)
//     {
//         perror("open");
//         return 1;
//     }
//     return 0;
// }
// //用位图传参
// #define ONE 1
// #define TWO (1<<1)
// #define THREE (1<<2)
// #define FOUR (1<<3)
// #define FIVE (1<<4)

// void myPrint(int flag)
// {
//     if(flag & ONE) printf("1");
//     if(flag & TWO) printf("2");
//     if(flag & THREE) printf("3");
//     if(flag & FOUR) printf("4");
//     if(flag & FIVE) printf("5");
//     printf("\n");
// }

// int main()
// {
//     myPrint(ONE);
//     myPrint(TWO);
//     myPrint(ONE | TWO);
//     myPrint(THREE | FOUR | FIVE);
//     myPrint(FIVE);
//     return 0;
// }

// int main()
// {
//     //fscanf
//     char buffer[64];
//     fscanf(stdin,"%s",buffer);//从标准输出(键盘)中读取数据放到buffer中,空格和换行符作为分隔符
//     printf("%s\n",buffer);
//     return 0;
// }

// //常见的写函数
// int main()
// {
//     printf("hello printf\n");
//     fprintf(stdout,"hello fprintf\n");//将数据输出到标准输出中(stdout显示器设备);
//     fputs("hello fputs\n",stdout);//也是将数据输出到标准输出中,但不能像fprintf那样支持格式化输出
//     const char* msg = "hello fwrite\n";
//     fwrite(msg,1,strlen(msg),stdout);
//     return 0;
// }

// //练习读
// int main()
// {
//     FILE* fp = fopen(FILENAME,"r");
//     if(fp == NULL)
//     {
//         perror("fopen");
//         return 1;
//     }
//     char buffer[64];
//     while(1)
//     {
//         char* r = fgets(buffer,sizeof(buffer),fp);
//         if(!r) break;//返回NULL则终止读
//         printf("%s\n",buffer);
//     }

//     return 0;
// }

//修改进程的工作目录
// int main()
// {
//     int i = chdir("/root/study/linux-learning");
//     if(i)
//     {
//         printf("转换失败\n");
//     }
//     FILE* fp = fopen(FILENAME,"w");
//     if(fp == NULL)
//     {
//         perror("fopen");
//         return 1;
//     }
//     const char* msg = "hello HF";
//     int cnt = 6;
//     while(cnt)
//     {
//         int n = fwrite(msg,strlen(msg),1,fp);
//         printf("write %d block\n",n);
//         cnt--;
//     }

//     fclose(fp);
//     return 0;
// }


// int main()
// {
//      while(1)
//     {
//         sleep(3);
//         printf("procee running,pid: %d\n",getpid());
//     }
//     return 0;
// }

// //练习读写操作
// int main()
// {
//     FILE* fp = fopen(FILENAME,"w");
//     if(fp == NULL)
//     {
//         perror("fopen");
//         return 1;
//     }
//     const char* msg = "hello HF";
//     int cnt = 6;
//     while(cnt)
//     {
//         int n = fwrite(msg,strlen(msg),1,fp);
//         printf("write %d block\n",n);
//         cnt--;
//     }

//     fclose(fp);
//     return 0;
// }

// int main()
// {
//     FILE *fp = fopen("./log.txt","a");
//     if(fp == NULL)
//     {
//         perror("fopen");
//         return 1;
//     }
//     const char* str = "hello file\n";
//     fputs(str,fp);
//     fclose(fp);
//     return 0;
// }